"""
---------------------------------------------------------------------
- File: 同步与异步.py
- Date: 2025/5/27
- Author: yangzhide
- Email: xxzjyzd@126.com
- Description: 异步编程理解
---------------------------------------------------------------------
"""
"""
同步编程：按顺序执行任务，当前任务完成之后，再执行下一个任务
场景模拟：下载资源（当前资源下载完成之后，再点击下载后一个资源）
"""
import time
import asyncio

# 资源列表
booklist = ["百年孤独","杀死一只知更鸟","被讨厌的勇气"]

def sync_download(resource_name):
    start_time = time.time()
    print(f"资源【{resource_name}】 开始已下载")
    time.sleep(3)  # 模拟下载耗时
    end_time = time.time()
    total_time = end_time - start_time
    print(f"资源【{resource_name}】 已下载成功！耗时{total_time} 秒")

def dl_sync_main(books: list):
    start_time = time.time()
    for b in books:
        sync_download(b)
    end_time = time.time()
    # 消耗
    total_time = end_time - start_time
    print(f"所有资源下载总耗时：{total_time}秒")

# 同步执行
# dl_sync_main(booklist)

"""
异步编程：基于协程方式，在一个线程中，当前任务需要等待时，将会去执行其他任务
场景模拟：下载资源（当前资源下载需要等待时，将去下载下一个资源）
"""

async def async_download(resource_name):
    start_time = time.time()
    print(f"资源【{resource_name}】 开始已下载")
    await asyncio.sleep(3)  # 模拟下载耗时
    end_time = time.time()
    total_time = end_time - start_time
    print(f"资源【{resource_name}】 已下载成功！耗时{total_time:.2f} 秒")

async def dl_async_main(books: list):
    start_time = time.time()
    await asyncio.gather( *[async_download(b)  for b in books])
    end_time = time.time()
    # 消耗
    total_time = end_time - start_time
    print(f"所有资源下载总耗时：{total_time:.2f}秒")

# 异步执行
asyncio.run(dl_async_main(booklist))